﻿/*
 * 
 * 
 * 参考网页： https://docs.microsoft.com/zh-cn/dotnet/csharp/whats-new/csharp-10
 * .Net6的30天学习网站（推荐） https://www.conradakunga.com/blog/
 * 
 * 
*/
namespace CSharpNewFeatures;
using System.Text;


public class CsharpDemo10 : CsharpDemoBase
{
    public override void Run()
    {
        //  1 记录结构
        test1_record_struct();

        //  2 结构类型的改进
        test2_struct_improvement();

        //  3 内插字符串处理程序: 能够自定义的内插字符串处理程序处理内插字符串的工作方式。
        //  4 global using 指令： 可将 global 修饰符添加到任何 using 指令，以指示编译器该指令适用于编译中的所有源文件。
        //  5 文件范围的命名空间声明： namespace MyNamespace; 这个新语法为最常见的 namespace 声明节省了水平和垂直空间。
        //  6 扩展属性模式
        //  7 对 Lambda 表达式的改进
        //  8 可使用 const 内插字符串： 从 C# 10 开始，如果所使用的所有表达式也是常量字符串，则内插字符串可以是常量。 
        //  9 记录类型可密封 ToString()
        // 10 改进型明确赋值
        // 11 在同一析构中可同时进行赋值和声明： 可以在解构时不用同时定义变量。
        // 12 可在方法上使用 AsyncMethodBuilder 属性
        // 13 CallerArgumentExpression 属性
        // 14 增强的 #line pragma

        test1();
        test2();
        test3();
        test4();
        test5();

        Console.WriteLine("Done.");
    }

    private void test2_struct_improvement()
    {
        Console.WriteLine("under construction");
    }

    private void test1_record_struct()
    {
        Console.WriteLine("使用以下语法定义recored的结构体");
        Console.WriteLine("public readonly record struct Point(double X, double Y, double Z);");
    }

    private void test0()
    {
        object? obj1 = "hello";
        if (DateTime.Now.Year > 2000)
        {
            obj1 = null;
        }

        var obj2 = obj1 ?? "Jack";
        obj1 ??= "Tome";
        object? objt = null;
        var obj3 = objt?.ToString(); // 返回为 null 或 string 类型

        Console.WriteLine($"obj1 = {obj1}\ttype = {obj1.GetType().FullName}");
        Console.WriteLine($"obj2 = {obj2}\ttype = {obj2.GetType().FullName}");
        // Console.WriteLine($"obj3 = {obj2}\ttype = {obj3.GetType().FullName}");
    }

    class Animal { public string? Name; }
    class Dog : Animal { }
    public void test1()
    {
        List<Dog> dogs = new List<Dog>();
        dogs.Add(new Dog { Name = "Beibei" });
        dogs.Add(new Dog { Name = "Alaska" });

        //List<Animal> animals = dogs;
        IEnumerable<Animal> animals1 = dogs;
        foreach (Animal animal in animals1)
            Console.WriteLine(animal.Name);
    }

    /// <summary>
    /// 从字符串中读取相关内容。
    /// </summary>
    /// <param name="file"></param>
    /// <param name="encoding"></param>
    /// <returns></returns>
    public List<string> ReadLines(string file, Encoding encoding)
    {
        var lines = new List<string>();
        var items = File.ReadAllLines(file, encoding);
        foreach (var item in items)
        {
            var s = item.ToString();
            if (!string.IsNullOrEmpty(s) && !s.StartsWith("#") && !s.StartsWith("//"))
                lines.Add(s);
        }

        return lines;
    }

    private void test2()
    {

    }

    private void test3()
    {

    }

    private void test4()
    {

    }

    private void test5()
    {

    }
}
